#include "cGUI.h"
#include <algorithm>
#include <math.h>

GUI::GUI(){
    controle = new Curva();
    bezier = new Curva();
}

void GUI::geraBezier(int numPontos){
    bezier->pontos.clear();
    int comprimento = controle->calcComprimento();
    //int numPontos = ((0.000002*(pow(comprimento,2))+(comprimento/10))/7)*controle->pontos.size();;
    //printf("\n%d", numPontos);
    //numPontos = 100;

    std::map<int,Ponto> mapBK;
    std::list<Ponto*>::iterator iterador;
    int i = 0;
    for(iterador = controle->pontos.begin(); iterador != controle->pontos.end(); iterador++ ) {
        Ponto * temp = *iterador;
        mapBK[i++] = *temp;
    }

    i = 0;
    int j = 0;
    double somatorio = 0;
    double total = 0;

    //printf("Nova\n");

    for (int f = 0; f <= numPontos; f++){
        double distancia;
        if (i+1 < controle->pontos.size()){
            distancia = mapBK[i].calcDistancia(&mapBK[i+1]);
        } else {
            distancia = 0;;
        }
        double inversa = 1/distancia;
        double porcento = distancia/comprimento;
        int numPontosControle = numPontos*porcento;
        somatorio = somatorio + inversa;
        j++;
        if (j>numPontosControle){
            i++;
            j=0;
        }
    }

    i = 0;
    j = 0;
    total = 0;

    Ponto deCasteljau = controle->calculaDeCasteljau(0);
    if (deCasteljau.getX() < WIDTH || deCasteljau.getY()  < HEIGHT){
        bezier->forcaInserePonto(new Ponto(deCasteljau.getX(), deCasteljau.getY()));
    }

    for (int f = 0; f <= numPontos; f++){
        int distancia = 0;
        if (i+1 < controle->pontos.size()){
            distancia = mapBK[i].calcDistancia(&mapBK[i+1]);
            //printf("Cam 1: %d\n",distancia);
        } else {
            distancia = 0;
            //printf("Cam 2: %d\n",distancia);
        }
        double porcento = distancia/(double)comprimento;
        int numPontosControle = numPontos * porcento;
        double incremento = 0;
        if (distancia != 0) {
            incremento = (1/(double)distancia)/somatorio;
        }
        //printf("Inc: %f Dist: %d Comp: %d Porc: %f nPC: %d, I: %d J: %d Total: %f\n", incremento, distancia, comprimento, porcento, numPontosControle, i, j, total);
        Ponto deCasteljau = controle->calculaDeCasteljau(total+=incremento);              //ORIGINAL (double)f/numPontos
        if (deCasteljau.getX() < WIDTH || deCasteljau.getY()  < HEIGHT){                    //ORIGINAL
            bezier->forcaInserePonto(new Ponto(deCasteljau.getX(), deCasteljau.getY()));    //ORIGINAL
        }
        j++;
        if (j>numPontosControle){
            i++;
            j=0;
        }
    }
}

Curva* GUI::getControle(){
    return this->controle;
}

Curva* GUI::getBezier(){
    return this->bezier;
}
